home *** CD-ROM | disk | FTP | other *** search
- ' ###############################
- ' # #
- ' # "CreepDials"-Demo #
- ' # ~~~~~~~~~~~~~~~~~ #
- ' # #
- ' # für GFA-Basic 3.x #
- ' # #
- ' # von Manuel Hermann #
- ' # (c) 1992 by TOS-Magazin #
- ' # #
- ' ###############################
- '
- RESERVE 50*1024
- '
- ' Resource Datei Indizes für CRP_DIAL
- LET popup&=0 !Formular/Dialog
- LET sex_box&=1 !BOX in Baum POPUP
- LET option_box&=4 !BOX in Baum POPUP
- LET info&=1 !Formular/Dialog
- LET inf_abbr&=11 !BUTTON in Baum INFO
- LET demo&=12 !BUTTON in Baum INFO
- '
- LET dialog&=2 !Formular/Dialog
- LET name&=3 !FTEXT in Baum DIALOG
- LET sex&=4 !STRING in Baum DIALOG
- LET sex_but&=5 !BOXTEXT in Baum DIALOG
- LET basic&=7 !BUTTON in Baum DIALOG
- LET pascal&=8 !BUTTON in Baum DIALOG
- LET c&=9 !BUTTON in Baum DIALOG
- LET modula&=10 !BUTTON in Baum DIALOG
- LET assembl&=11 !BUTTON in Baum DIALOG
- LET a1040&=13 !BUTTON in Baum DIALOG
- LET mega&=14 !BUTTON in Baum DIALOG
- LET st_book&=15 !BUTTON in Baum DIALOG
- LET tt&=16 !BUTTON in Baum DIALOG
- LET falcon&=17 !BUTTON in Baum DIALOG
- LET option&=18 !BOXTEXT in Baum DIALOG
- LET demo_abbr&=19 !BUTTON in Baum DIALOG
- LET demo_ok&=20 !BUTTON in Baum DIALOG
- '
- LET what_but&=3 !Formular/Dialog
- LET b_ind&=4 !STRING in Baum WHAT_BUT
- LET b_text&=6 !STRING in Baum WHAT_BUT
- LET b_ok&=7 !BUTTON in Baum WHAT_BUT
- '
- '
- IF RSRC_LOAD("CRPDIALS.RSC")=0
- ALERT 3,"| Kein RSC-File. ",1,"Abbruch",dummy|
- ELSE
- '
- DEFMOUSE 0
- '
- ALERT 2,"| --- CreepDials ---| |Form der Radiobuttons: ",2," eckig |rund",r|
- r!=PRED(r|)
- '
- ALERT 2,"| --- CreepDials ---| | Aussehen der Ecke: ",2,"FlyDials|7UP",e|
- e!=PRED(e|)
- '
- ALERT 2,"| Dialoge realtiv zur | Maus ausrichten? ",2," Nein |Ja",m|
- m!=PRED(m|)
- '
- ' einmalig nach dem Laden der RSC-Datei aufrufen:
- '
- prepare_rsc(what_but&,popup&,r!,e!,m!)
- '
- IF error%
- '
- DO
- '
- ' Dialog darstellen und verwalten:
- '
- do_dial(info&,button&)
- EXIT IF button&=inf_abbr&
- '
- CHAR{{OB_SPEC(t_a%(dialog&),name&)}}="Otto Normaluser"
- do_dial(dialog&,button&)
- '
- CHAR{OB_SPEC(t_a%(what_but&),b_ind&)}=STR$(button&)
- CHAR{OB_SPEC(t_a%(what_but&),b_text&)}=CHAR{OB_SPEC(t_a%(dialog&),button&)}
- do_dial(what_but&,button&)
- '
- LOOP
- '
- ' reservierten Speicherblock wieder freigeben:
- '
- mem_free
- '
- ELSE
- ALERT 3,"|Programm kann wegen|Speichermangel nicht|ausgeführt werden. ",1," OK ",dummy|
- ENDIF
- '
- ~RSRC_FREE()
- '
- ENDIF
- '
- EDIT
- '
- '
- ' *****************************************************************************
- '
- ' "CreepDials"-Library für GFA-Basic 3.x
- '
- ' Autor: Manuel Hermann
- ' Betatester: Anton Stepper ("Vielen Dank!")
- '
- ' (c) 1992 by TOS-Magazin
- '
- ' *****************************************************************************
- '
- ' ACHTUNG:
- ' Falls die "CreepDials"-Library mit MERGE eingefügt wurde, muß im
- ' Unterprogramm 'assm_modul' die Datei 'CRPDIALS.INL' nachgeladen werden.
- ' In der Prozedur 'do_dial' wird die Library an eigene Popups angepasst.
- '
- > PROCEDURE assm_modul !Assemblermodul (Nachladen!)
- '
- ' Folgende Zeile reserviert 996 Bytes für das benötigte Assemblermodul.
- ' Mit Cursor in der Befehlszeile und 'HELP' kann die Datei 'CRPDIALS.INL'
- ' geladen werden. (siehe GFA-Handbuch unter INLINE)
- '
- ' ## INLINE:
- ' $0000: 00 0c 37 9a 00 04 00 08 00 10 20 2f 00 04 48 e7
- ' $0010: 7f fe 2c 40 2a 7a ff ea 3e 3a ff ea 49 fa 02 ac
- ' $0020: 70 00 61 00 02 be 4c ae 00 03 00 0a d0 7a ff d8
- ' $0030: 34 2e 00 10 e2 42 36 02 d2 42 53 41 34 3a ff c8
- ' $0040: 53 42 38 3a ff c4 b8 7c 00 08 67 02 53 43 48 94
- ' $0050: 00 0f 61 00 02 7e 30 2e 00 08 c0 7c 00 01 67 00
- ' $0060: 00 e6 70 01 61 00 02 7c 4c 94 00 0f 57 42 57 43
- ' $0070: 38 3a ff 96 b8 7c 00 08 66 04 53 42 52 43 61 00
- ' $0080: 02 52 60 00 00 c2 20 2f 00 04 48 e7 7f fe 2c 40
- ' $0090: 2a 7a ff 6e 3e 3a ff 6e 49 fa 02 30 70 00 61 00
- ' $00a0: 02 42 4c ae 00 0f 00 0a 52 40 52 41 d6 41 34 00
- ' $00b0: d4 7a ff 54 d4 7a ff 50 57 42 57 43 48 94 00 0f
- ' $00c0: 61 00 02 2e 30 2e 00 08 c0 7c 00 01 67 78 70 01
- ' $00d0: 61 00 02 10 4c 94 00 0f 56 40 56 41 57 42 57 43
- ' $00e0: 61 00 02 0e 60 60 20 2f 00 04 48 e7 7f fe 2c 40
- ' $00f0: 2a 7a ff 0e 3e 3a ff 0e 49 fa 01 d0 70 00 61 00
- ' $0100: 01 e2 4c ae 00 0f 00 0a d6 41 34 00 d4 7a fe f8
- ' $0110: d4 7a fe f4 55 42 55 43 48 94 00 0f 61 00 01 d2
- ' $0120: 30 2e 00 08 c0 7c 00 01 67 1c 4c 94 00 0f 61 00
- ' $0130: 01 d0 4c 94 00 0f d2 6e 00 10 96 6e 00 10 55 41
- ' $0140: 54 43 61 00 01 bc 4c ae 00 03 00 0a d0 7a fe b8
- ' $0150: d0 7a fe b4 d0 7a fe b0 34 2e 00 10 36 3a fe aa
- ' $0160: e6 43 94 43 d2 42 53 41 24 2e 00 1a 61 00 01 ae
- ' $0170: 30 2e 00 08 08 80 00 00 4c df 7f fe 4e 75 20 2f
- ' $0180: 00 04 48 e7 7f fe 2c 40 2a 7a fe 76 3e 3a fe 76
- ' $0190: 49 fa 01 38 70 00 61 00 01 4a 4c ae 00 0f 00 0a
- ' $01a0: d4 40 d6 41 38 3a fe 62 e2 44 d2 44 e2 44 d2 44
- ' $01b0: 38 80 39 41 00 02 61 00 01 38 39 7c ff ff 00 04
- ' $01c0: 4c 94 00 03 d0 7a fe 40 34 3a fe 3e e4 42 d2 42
- ' $01d0: 24 2e 00 1a 61 00 01 46 42 40 4c df 7f fe 4e 75
- ' $01e0: 20 2f 00 04 48 e7 7f fe 2c 40 2a 7a fe 14 3e 3a
- ' $01f0: fe 14 49 fa 00 d6 39 7c ff ff 00 04 4c ae 00 03
- ' $0200: 00 0a d2 6e 00 10 24 2e 00 1a 61 00 01 10 4c ae
- ' $0210: 00 07 00 0a d4 40 d2 6e 00 10 36 3a fd ec e6 43
- ' $0220: d2 43 52 41 36 01 61 00 00 d8 42 40 4c df 7f fe
- ' $0230: 4e 75 20 2f 00 04 48 e7 7f fe 2c 40 2a 7a fd c2
- ' $0240: 3e 3a fd c2 49 fa 00 84 61 62 30 2e 00 08 08 80
- ' $0250: 00 00 08 80 00 01 08 80 00 04 4c df 7f fe 4e 75
- ' $0260: 20 2f 00 04 48 e7 7f fe 2c 40 2a 7a fd 94 3e 3a
- ' $0270: fd 94 49 fa 00 56 61 34 4c ae 00 0f 00 0a d4 40
- ' $0280: d6 41 52 41 53 42 48 94 00 0f 34 00 61 72 4c 94
- ' $0290: 00 0f 32 03 61 6a 30 2e 00 08 08 80 00 00 08 80
- ' $02a0: 00 01 08 80 00 04 4c df 7f fe 4e 75 70 00 61 32
- ' $02b0: 4c ae 00 0f 00 0a d4 40 d6 41 57 40 55 41 54 42
- ' $02c0: 56 43 38 02 3a 03 34 00 60 44 00 cc 00 91 ff ff
- ' $02d0: ff ff 22 6d 00 08 48 91 00 0f 41 fa 00 c0 60 00
- ' $02e0: 00 a8 22 6d 00 04 32 80 41 fa 00 be 60 00 00 9a
- ' $02f0: 22 6d 00 08 48 91 00 0f 41 fa 00 ba 60 00 00 8a
- ' $0300: 22 6d 00 08 48 91 00 0f 41 fa 00 b6 60 7a 22 6d
- ' $0310: 00 08 48 91 00 3f 41 fa 00 c0 60 6c 22 6d 00 08
- ' $0320: 32 80 33 41 00 02 48 94 00 03 22 6d 00 04 20 42
- ' $0330: 70 00 72 00 74 00 39 7c ff ff 00 06 52 41 10 18
- ' $0340: b0 3c 00 5b 66 08 d5 54 42 6c 00 06 60 f0 d4 7a
- ' $0350: fc b6 32 c0 66 e6 41 fa 00 74 53 41 31 41 00 06
- ' $0360: 4a 6c 00 04 6b 22 4a 6c 00 06 6b 1c 61 1a 4c 94
- ' $0370: 00 03 34 3a fc 94 e6 42 d2 42 36 01 34 00 d4 7a
- ' $0380: fc 86 53 42 60 00 ff 7a 22 55 4c 90 00 3f 48 91
- ' $0390: 00 bf 22 0d 30 3c 00 73 4e 42 4e 75 00 0b 00 02
- ' $03a0: 00 00 00 00 00 00 00 05 00 17 00 00 00 00 00 01
- ' $03b0: 00 01 00 00 00 0b 00 02 00 00 00 00 00 00 00 01
- ' $03c0: 00 06 00 02 00 00 00 00 00 00 00 00 00 08 00 01
- ' $03d0: 00 00 00 04 00 00 00 00 00 09 00 03 00 00 00 00
- ' $03e0: 00 00 00 00
- ' 996 Bytes.
- INLINE inl%,996
- '
- RETURN
- > PROCEDURE prepare_rsc(t_max&,pop&,r_fl!,e_fl!,m_fl!) !installiert "CreepDials"
- '
- ' t_max& => Index des letzten Objektbaums der RSC
- ' pop& => Index des Popup-Objektbaums
- ' r_fl! => runde/eckige Radiobuttons (Flag)
- ' e_fl! => "FlyDials"/"ChickenDials" (Flag)
- ' m_fl! => Dialog zentrieren/relativ zur Maus (Flag)
- '
- ' Felder:
- ' t_a%(t_c&) => Adressen der Objektbäume
- ' t_inf&(t_c&,0) => X-Koordinate der Dialogbox
- ' t_inf&(t_c&,1) => Y-Koordinate der Dialogbox
- ' t_inf&(t_c&,2) => Breite der Dialogbox
- ' t_inf&(t_c&,3) => Höhe der Dialogbox
- ' t_inf&(t_c&,4) => Index der Verschiebungs-Ecke
- ' t_inf&(t_c&,5) => interner Zähler
- ' t_inf&(t_c&,6) => Index des letzten Objekts des Baumes
- ' t_inf&(t_c&,7) => Index des ersten Editobjekts (wenn vorhanden)
- ' t_inf&(t_c&,8) => interner Zähler
- ' t_inf&(t_c&,9) => Index des Abbruch-Buttons (wenn vorhanden)
- ' para%(0) => max. horizontale Pixelposition
- ' para%(1) => max. vertikale Pixelposition
- ' para%(2) => Zeichenzellenbreite
- ' para%(3) => Zeichenzellenhöhe
- ' para%(4) => Adresse der Tastencode-Umwandlungstabelle (unshift)
- ' para%(5) => Adresse der Tastencode-Umwandlungstabelle (shift)
- ' para%(6) => Dialog zentrieren/relativ zur Maus (Flag)
- ' para%(7) => Index des Popup-Objektbaumes
- '
- '
- LOCAL txt$
- LOCAL inl%,rsc_mem%,pop_mem%
- LOCAL ob_max&,ob_c&,user_c&,t_c&
- LOCAL xz&,yz&,offset&,i&,flag&,b&,n_ob&
- '
- DIM vdi_pb%(4),para%(7)
- DIM t_a%(t_max&)
- DIM t_inf&(t_max&,9)
- DIM q_ras0&(9),z_ras0&(9)
- DIM q_ras1&(9),z_ras1&(9)
- DIM q_ras2&(9),z_ras2&(9)
- '
- ' Resource-Info holen:
- '
- FOR t_c&=0 TO t_max&
- '
- ~RSRC_GADDR(0,t_c&,t_a%(t_c&)) !Baumadresse ermitteln
- '
- ' "Hey Anton, noch mal Danke für den Hinweis."
- '
- WHILE NOT BTST(OB_FLAGS(t_a%(t_c&),t_inf&(t_c&,6)),5)
- '
- i&=ROR(AND(OB_TYPE(t_a%(t_c&),t_inf&(t_c&,6)),&HFF00),8)
- '
- IF i&>=17 AND i&<=20
- INC user_c&
- ENDIF
- '
- INC t_inf&(t_c&,6)
- '
- WEND
- '
- ob_max&=MAX(ob_max&,t_inf&(t_c&,6))
- '
- NEXT t_c&
- '
- DEC ob_max&
- DIM userblk%(user_c&*2)
- DIM char&(t_max&,ob_max&,1),xy&(t_max&,ob_max&,3)
- CLR user_c&
- para%(6)=m_fl!
- para%(7)=pop&
- '
- ' Aktuelle Auflösung ermitteln:
- '
- CONTRL(2)=6
- INTIN(0)=0
- VDISYS 102,1,0,0
- para%(0)=INTOUT(0) !max. X
- para%(1)=INTOUT(1) !max. Y
- '
- ' Anzahl der Bitplanen ermitteln:
- '
- CONTRL(2)=6
- INTIN(0)=1
- VDISYS 102,1,0,0
- z_ras0&(6)=INTOUT(4)
- z_ras1&(6)=INTOUT(4)
- z_ras2&(6)=INTOUT(4)
- '
- ' Zeichenzellenbreite und -höhe ermitteln:
- '
- CONTRL(2)=2
- CONTRL(4)=6
- VDISYS 38
- para%(2)=PTSOUT(2) !Zeichenzellenbreite
- para%(3)=PTSOUT(3) !Zeichenzellenhöhe
- '
- ' Adressen der Scancodetabellen holen:
- '
- para%(4)={XBIOS(16,L:-1,L:-1,L:-1)} !unshift
- para%(5)={XBIOS(16,L:-1,L:-1,L:-1)+4} !shift
- '
- vdi_pb%(0)=CONTRL
- vdi_pb%(1)=INTIN
- vdi_pb%(2)=PTSIN
- vdi_pb%(3)=INTOUT
- vdi_pb%(4)=PTSOUT
- '
- assm_modul
- LPOKE inl%,V:vdi_pb%(0)
- DPOKE inl%+4,V~H
- DPOKE inl%+6,para%(2)
- DPOKE inl%+8,para%(3)
- '
- ' größte Popup-Box ermitteln:
- '
- IF pop&>=0 !Popup
- n_ob&=1
- '
- WHILE n_ob&<>0
- '
- b&=((OB_W(t_a%(pop&),n_ob&)+21) DIV 16)*16 !Breite an 16 Pixel-Grenze
- pop_mem%=MAX(pop_mem%,b&*(OB_H(t_a%(pop&),n_ob&)+5)) !Breite * Höhe
- '
- n_ob&=OB_NEXT(t_a%(pop&),n_ob&) !nächste Popup-Box
- WEND
- '
- ENDIF
- '
- ' Objektbäume modifizieren:
- '
- FOR t_c&=0 TO t_max&
- '
- FOR ob_c&=0 TO t_inf&(t_c&,6)
- '
- SELECT ROR(AND(OB_TYPE(t_a%(t_c&),ob_c&),&HFF00),8)
- '
- CASE 17 !Ecke
- t_inf&(t_c&,4)=ob_c&
- IF e_fl!
- instal_g_user(inl%+562) !"FlyDials"-Ecke
- ELSE
- instal_g_user(inl%+608) !"ChickenDials"-Ecke
- ENDIF
- CASE 18 !Button
- '
- txt$=CHAR{OB_SPEC(t_a%(t_c&),ob_c&)}
- offset&=PRED(INSTR(txt$,"["))
- '
- IF offset&>=0
- char&(t_c&,t_inf&(t_c&,5),0)=ASC(UPPER$(MID$(txt$,offset&+2,1)))
- char&(t_c&,t_inf&(t_c&,5),1)=ob_c&
- INC t_inf&(t_c&,5)
- ENDIF
- '
- flag&=OB_FLAGS(t_a%(t_c&),ob_c&)
- '
- IF BTST(flag&,2) !Exit-Button
- '
- IF offset&>=0
- '
- txt$=LEFT$(txt$,offset&)+RIGHT$(txt$,LEN(txt$)-SUCC(offset&))
- CHAR{OB_SPEC(t_a%(t_c&),ob_c&)}=txt$
- '
- OB_Y(t_a%(t_c&),ob_c&)=OB_Y(t_a%(t_c&),ob_c&)-2
- OB_H(t_a%(t_c&),ob_c&)=OB_H(t_a%(t_c&),ob_c&)+2
- '
- ~OBJC_OFFSET(t_a%(t_c&),ob_c&,xz&,yz&)
- xz&=xz&+OB_W(t_a%(t_c&),ob_c&)/2-LEN(txt$)*para%(2)/2+para%(2)/2
- yz&=yz&+OB_H(t_a%(t_c&),ob_c&)/2+para%(3)/2
- '
- xy&(t_c&,t_inf&(t_c&,8),0)=xz&+offset&*para%(2)
- xy&(t_c&,t_inf&(t_c&,8),2)=xy&(t_c&,t_inf&(t_c&,8),0)+para%(2)-2
- xy&(t_c&,t_inf&(t_c&,8),1)=yz&+2
- xy&(t_c&,t_inf&(t_c&,8),3)=xy&(t_c&,t_inf&(t_c&,8),1)
- INC t_inf&(t_c&,8)
- '
- ENDIF
- '
- IF UPPER$(txt$)="ABBRUCH"
- t_inf&(t_c&,9)=ob_c&
- ENDIF
- '
- ELSE IF BTST(flag&,6) AND BYTE(OB_TYPE(t_a%(t_c&),ob_c&))=28 !String
- '
- IF offset&>=0
- '
- txt$=LEFT$(txt$,offset&)+RIGHT$(txt$,LEN(txt$)-SUCC(offset&))
- CHAR{OB_SPEC(t_a%(t_c&),ob_c&)}=txt$
- '
- ~OBJC_OFFSET(t_a%(t_c&),ob_c&,xz&,yz&)
- '
- xy&(t_c&,t_inf&(t_c&,8),0)=xz&+offset&*para%(2)+3
- xy&(t_c&,t_inf&(t_c&,8),2)=xy&(t_c&,t_inf&(t_c&,8),0)+para%(2)-2
- xy&(t_c&,t_inf&(t_c&,8),1)=yz&+para%(3)+2
- xy&(t_c&,t_inf&(t_c&,8),3)=xy&(t_c&,t_inf&(t_c&,8),1)
- INC t_inf&(t_c&,8)
- '
- ENDIF
- '
- ELSE
- '
- IF offset&>=0
- OB_W(t_a%(t_c&),ob_c&)=OB_W(t_a%(t_c&),ob_c&)+para%(2)*2
- ELSE
- OB_W(t_a%(t_c&),ob_c&)=OB_W(t_a%(t_c&),ob_c&)+para%(2)*3
- ENDIF
- '
- IF BTST(flag&,4) !Radiobutton
- '
- IF r_fl!
- instal_g_user(inl%+10) !rund
- ELSE
- instal_g_user(inl%+134) !eckig
- ENDIF
- '
- ELSE IF BTST(flag&,0) !Checkbutton
- instal_g_user(inl%+230)
- ENDIF
- '
- ENDIF
- '
- CASE 19 !Unterstreichen
- instal_g_user(inl%+480)
- CASE 20 !Rahmen
- instal_g_user(inl%+382)
- CASE 22 !Popup
- '
- txt$=CHAR{{OB_SPEC(t_a%(t_c&),ob_c&)}}
- offset&=PRED(INSTR(txt$,"["))
- '
- IF offset&>=0
- char&(t_c&,t_inf&(t_c&,5),0)=ASC(UPPER$(MID$(txt$,offset&+2,1)))
- char&(t_c&,t_inf&(t_c&,5),1)=ob_c&
- INC t_inf&(t_c&,5)
- '
- txt$=LEFT$(txt$,offset&)+RIGHT$(txt$,LEN(txt$)-SUCC(offset&))
- CHAR{{OB_SPEC(t_a%(t_c&),ob_c&)}}=txt$
- '
- ~OBJC_OFFSET(t_a%(t_c&),ob_c&,xz&,yz&)
- '
- xy&(t_c&,t_inf&(t_c&,8),0)=xz&+offset&*para%(2)+3
- xy&(t_c&,t_inf&(t_c&,8),2)=xy&(t_c&,t_inf&(t_c&,8),0)+para%(2)-2
- xy&(t_c&,t_inf&(t_c&,8),1)=yz&+para%(3)+3
- xy&(t_c&,t_inf&(t_c&,8),3)=xy&(t_c&,t_inf&(t_c&,8),1)
- INC t_inf&(t_c&,8)
- '
- OB_W(t_a%(t_c&),ob_c&)=OB_W(t_a%(t_c&),ob_c&)-para%(2)
- OB_H(t_a%(t_c&),ob_c&)=OB_H(t_a%(t_c&),ob_c&)+2
- '
- ENDIF
- '
- ENDSELECT
- '
- IF (OB_FLAGS(t_a%(t_c&),ob_c&) AND 8) AND t_inf&(t_c&,7)=0
- t_inf&(t_c&,7)=ob_c& !erstes Editobjekt
- ENDIF
- '
- NEXT ob_c&
- '
- DEC t_inf&(t_c&,5) !char_count
- DEC t_inf&(t_c&,8) !line_count
- '
- ~FORM_CENTER(t_a%(t_c&),t_inf&(t_c&,0),t_inf&(t_c&,1),t_inf&(t_c&,2),t_inf&(t_c&,3))
- '
- ' Größe der vom größten Dialog bedeckten Fläche:
- '
- b&=((OB_W(t_a%(t_c&),0)+21) DIV 16)*16 !Breite an 16 Pixel-Grenze
- rsc_mem%=MAX(rsc_mem%,b&*(OB_H(t_a%(t_c&),0)+6)) !Breite * Höhe
- '
- NEXT t_c&
- '
- ' Größe der benötigten Speicherblocks ermitteln und anfordern:
- '
- pop_mem%=(z_ras0&(6)*pop_mem%) DIV 8 !(Fläche * Bitplanen) / 8
- rsc_mem%=(z_ras0&(6)*rsc_mem%) DIV 8 !(Fläche * Bitplanen) / 8
- error%=MALLOC(2*rsc_mem%+pop_mem%)
- '
- LPOKE V:z_ras0&(0),error%
- LPOKE V:z_ras1&(0),error%+rsc_mem%
- LPOKE V:z_ras2&(0),error%+2*rsc_mem%
- '
- RETURN
- > PROCEDURE do_dial(i&,VAR b&) !komplette Dialogverwaltung
- '
- ' i& => Index des Dialogs
- ' b& => Index des betätigten Buttons (back)
- '
- LOCAL pop_flag!
- '
- draw_dial(i&)
- '
- REPEAT
- form_do(i&,b&)
- '
- pop_flag!=TRUE
- '
- IF i&=dialog& !nur bei best. Dialog
- '
- IF b&=sex_but& OR b&=sex& !"Geschlecht"-Popup
- popup_select(i&,sex_but&,sex_box&,geschl&,geschl&)
- pop_flag!=FALSE
- ENDIF
- '
- IF b&=option& !"Optionen"-Popup
- popup_menu(i&,option&,option_box&,1,opt&)
- pop_flag!=FALSE
- '
- SELECT opt&
- CASE 0
- ALERT 1,"|Eine GEM-Library |von Manuel Hermann. ",1," OK ",dummy|
- CASE 1
- ALERT 1,"|Magazin plus Software |für den ATARI ST & TT ",1," OK ",dummy|
- CASE 2
- ALERT 1,"|Many greetings to |all members of |THE INDEPENDENT.",1," YO! ",dummy|
- CASE 3
- ALERT 1,"|hilfreiche Bücher: |'Vom Anfänger zum GEM-Profi' |'ATARI Profibuch ST-STE-TT'",1," OK ",dummy|
- ENDSELECT
- '
- ENDIF
- '
- ENDIF
- '
- UNTIL pop_flag!
- '
- undraw_dial(i&)
- RETURN
- > PROCEDURE popup_select(b_t&,but&,ob&,def&,VAR st&) !Auswahl
- '
- ' b_i& => Index des Dialogs
- ' but& => Index des betätigten Buttons
- ' ob& => Index des Popups
- ' def& => Default-Eintrag
- ' st& => betätigter Eintrag (back)
- '
- popup(-1,b_t&,but&,ob&,def&,st&)
- RETURN
- > PROCEDURE popup_menu(b_t&,but&,ob&,pl&,VAR st&) !Menu
- '
- ' b_i& => Index des Dialogs
- ' but& => Index des betätigten Buttons
- ' ob& => Index des Popups
- ' pl& => Popup wird relativ zu diesem Eintrag ausgerichtet
- ' st& => betätigter Eintrag (back)
- '
- popup(0,b_t&,but&,ob&,pl&,st&)
- RETURN
- > PROCEDURE mem_free !gibt Speicher zurück
- ~MFREE(error%)
- RETURN
- '
- > PROCEDURE popup(fl!,t_i&,but&,ob&,def&,VAR st&) !Popup-Verwaltung
- '
- ' fl! => select/menu (Flag)
- ' t_i& => Index des Dialogs
- ' but& => Index des betätigten Buttons
- ' ob& => Index des Popups
- ' def& => Default-Eintrag
- ' st& => betätigter Eintrag (back)
- '
- LOCAL n_ob&,ob_cn&,x&,y&,b&,h&,i&
- LOCAL mx&,my&,mb&,ks&,kr&,br&,m_flag!
- LOCAL akt_ob&,old_ob&,key_ob&,first&
- '
- ' Anzahl der Einträge ermitteln:
- '
- first&=OB_HEAD(t_a%(para%(7)),ob&) !erster Eintrag
- br&=first&
- WHILE br&<>ob&
- br&=OB_NEXT(t_a%(para%(7)),br&) !nächster Eintrag
- INC ob_cn&
- WEND
- DEC ob_cn&
- '
- ~OBJC_OFFSET(t_a%(t_i&),but&,x&,y&)
- OB_X(t_a%(para%(7)),0)=(x&+OB_W(t_a%(t_i&),but&) DIV 2)-(OB_X(t_a%(para%(7)),ob&)+OB_W(t_a%(para%(7)),ob&) DIV 2)
- OB_Y(t_a%(para%(7)),0)=MAX(para%(3)+4,MIN(para%(1)-4-OB_H(t_a%(para%(7)),ob&),y&-def&*para%(3)))-OB_Y(t_a%(para%(7)),ob&)
- '
- x&=OB_X(t_a%(para%(7)),0)+OB_X(t_a%(para%(7)),ob&)-1
- y&=OB_Y(t_a%(para%(7)),0)+OB_Y(t_a%(para%(7)),ob&)-1
- b&=OB_W(t_a%(para%(7)),ob&)+4
- h&=OB_H(t_a%(para%(7)),ob&)+4
- '
- scr2mem(2,x&,y&,b&,h&)
- ~OBJC_DRAW(t_a%(para%(7)),0,7,x&,y&,b&,h&)
- '
- IF fl!
- '
- ' Default-Eintrag mit Häckchen versehen:
- '
- GRAPHMODE 2
- INTIN(0)=8
- INTIN(1)=0
- PTSIN(0)=x&+para%(2)/2
- PTSIN(1)=y&-para%(3)/6+SUCC(def&)*para%(3)
- VDISYS 8,2,1
- GRAPHMODE 0
- '
- ENDIF
- '
- akt_ob&=first&+def&
- old_ob&=akt_ob&
- key_ob&=akt_ob&
- '
- ~OBJC_CHANGE(t_a%(para%(7)),akt_ob&,0,x&,y&,b&,h&,1,1)
- '
- ~EVNT_TIMER(200)
- ~GRAF_MKSTATE(mx&,my&,mb&,ks&)
- '
- IF mb&=1
- m_flag!=TRUE
- which&=4
- ENDIF
- '
- DO
- '
- IF NOT m_flag!
- which&=EVNT_MULTI(7,1,1,1,1,mx&,my&,1,1,0,0,0,0,0,0,0,mx&,my&,mb&,ks&,kr&,br&)
- ELSE
- ~GRAF_MKSTATE(mx&,my&,mb&,ks&)
- ENDIF
- '
- IF which& AND 1 !Tastaturereignis
- '
- IF akt_ob&<first& OR akt_ob&>first&+ob_cn&
- SELECT ROR(AND(kr&,&HFF00),8)
- CASE 72,80
- akt_ob&=key_ob&
- ENDSELECT
- ELSE
- br&=akt_ob&
- '
- SELECT ROR(AND(kr&,&HFF00),8)
- CASE 72
- IF akt_ob&>first&
- DEC akt_ob&
- DO WHILE NOT BTST(3,OB_STATE(t_a%(para%(7)),akt_ob&))
- EXIT IF akt_ob&<first&
- DEC akt_ob&
- LOOP
- IF akt_ob&<first&
- akt_ob&=br&
- ENDIF
- ENDIF
- CASE 80
- IF akt_ob&<first&+ob_cn&
- INC akt_ob&
- DO WHILE NOT BTST(3,OB_STATE(t_a%(para%(7)),akt_ob&))
- EXIT IF akt_ob&>first&+ob_cn&
- INC akt_ob&
- LOOP
- IF akt_ob&>first&+ob_cn&
- akt_ob&=br&
- ENDIF
- ENDIF
- ENDSELECT
- '
- ENDIF
- '
- ENDIF
- '
- IF which& AND 4 !Mausereignis
- akt_ob&=OBJC_FIND(t_a%(para%(7)),0,first&,mx&,my&)
- ENDIF
- '
- IF akt_ob&<>old_ob&
- ~OBJC_CHANGE(t_a%(para%(7)),old_ob&,0,x&,y&,b&,h&,0,1)
- ENDIF
- '
- IF (akt_ob&>=first& AND akt_ob&<=first&+ob_cn&) AND BTST(3,OB_STATE(t_a%(para%(7)),akt_ob&))
- ~OBJC_CHANGE(t_a%(para%(7)),akt_ob&,0,x&,y&,b&,h&,1,1)
- '
- old_ob&=akt_ob&
- key_ob&=akt_ob&
- st&=akt_ob&-first&
- ENDIF
- '
- LOOP UNTIL ((which& AND 2) OR ((which& AND 1) AND BYTE(kr&)=13)) OR (mb&<>1 AND m_flag!)
- '
- mem2scr(2,x&,y&,b&,h&)
- '
- IF st&=akt_ob&-first&
- '
- ~OBJC_CHANGE(t_a%(para%(7)),akt_ob&,0,x&,y&,b&,h&,0,0)
- '
- IF fl!
- '
- ' neuen Default-Text in Button eintragen:
- '
- CHAR{{OB_SPEC(t_a%(t_i&),but&)}}=CHAR{OB_SPEC(t_a%(para%(7)),akt_ob&)}
- '
- ' Button neu zeichnen:
- '
- ~OBJC_OFFSET(t_a%(t_i&),but&,x&,y&)
- ~OBJC_DRAW(t_a%(t_i&),0,7,x&,y&,OB_W(t_a%(t_i&),but&),OB_H(t_a%(t_i&),but&))
- '
- ENDIF
- '
- ELSE
- ~OBJC_CHANGE(t_a%(para%(7)),old_ob&,0,x&,y&,b&,h&,32,0)
- '
- IF fl!
- st&=def&
- ELSE
- st&=-1
- ENDIF
- '
- ENDIF
- '
- ' warten bis Maustaste wieder losgelassen wird:
- '
- REPEAT
- ~GRAF_MKSTATE(mx&,my&,mb&,ks&)
- UNTIL mb&=0
- '
- RETURN
- > PROCEDURE move_dial !Dialog verschieben
- '
- scr2mem(1,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
- '
- IF BTST(next_ob&,31)
- '
- mem2scr(0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
- ~FORM_CENTER(t_a%(t_i&),t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
- '
- ELSE
- '
- DEFMOUSE 4
- '
- IF BTST(ks&,3) !Alternate-Taste gedrückt?
- mem2scr(0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
- ~GRAF_DRAGBOX(t_inf&(t_i&,2),t_inf&(t_i&,3),t_inf&(t_i&,0),t_inf&(t_i&,1),0,para%(3)+2,SUCC(para%(0)),para%(1)-SUCC(para%(3)),x&,y&)
- ELSE
- ~GRAF_DRAGBOX(t_inf&(t_i&,2),t_inf&(t_i&,3),t_inf&(t_i&,0),t_inf&(t_i&,1),0,para%(3)+2,SUCC(para%(0)),para%(1)-SUCC(para%(3)),x&,y&)
- mem2scr(0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
- ENDIF
- '
- t_inf&(t_i&,0)=x&
- t_inf&(t_i&,1)=y&
- '
- OB_X(t_a%(t_i&),0)=t_inf&(t_i&,0)+3
- OB_Y(t_a%(t_i&),0)=t_inf&(t_i&,1)+3
- '
- DEFMOUSE 0
- ENDIF
- '
- scr2mem(0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
- mem2scr(1,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
- '
- RETURN
- > PROCEDURE form_do(t_i&,VAR back&) !erweiterte FORM_DO-Routine
- '
- ' t_i& => Index des Dialogs
- ' back& => Index des betätigten Buttons (back)
- '
- LOCAL edit_ob&,next_ob&,cont&,which&,x&,y&
- LOCAL mx&,my&,mb&,ks&,kr&,br&,idx&,i&
- LOCAL scan|,keytab%
- '
- DO
- '
- next_ob&=t_inf&(t_i&,7) !erstes Editobjekt
- CLR edit_ob&
- cont&=TRUE
- '
- WHILE cont&
- '
- IF next_ob&<>0 AND edit_ob&<>next_ob&
- edit_ob&=next_ob&
- next_ob&=0
- ~OBJC_EDIT(t_a%(t_i&),edit_ob&,0,idx&,1,idx&)
- ENDIF
- '
- which&=EVNT_MULTI(3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,mx&,my&,mb&,ks&,kr&,br&)
- '
- IF which& AND 1 !Tastaturereignis
- '
- cont&=FORM_KEYBD(t_a%(t_i&),edit_ob&,kr&,next_ob&,next_ob&,kr&)
- '
- IF BYTE(kr&)=0 !Kein ASCII-Code (Alternate)
- '
- scan|=ROR(AND(kr&,&HFF00),8)
- '
- IF scan|=97 AND t_inf&(t_i&,9)<>0 !Undo
- cont&=FORM_BUTTON(t_a%(t_i&),t_inf&(t_i&,9),br&,next_ob&)
- ENDIF
- '
- IF scan|>=120 AND scan|<=129
- SUB scan|,118
- keytab%=para%(4)
- ELSE
- keytab%=para%(5)
- ENDIF
- '
- FOR i&=0 TO t_inf&(t_i&,5)
- IF PEEK(keytab%+scan|)=char&(t_i&,i&,0)
- cont&=FORM_BUTTON(t_a%(t_i&),char&(t_i&,i&,1),br&,next_ob&)
- ENDIF
- NEXT i&
- '
- ENDIF
- '
- IF kr&
- ~OBJC_EDIT(t_a%(t_i&),edit_ob&,kr&,idx&,2,idx&)
- ENDIF
- '
- ENDIF
- '
- IF which& AND 2 !Mausereignis
- next_ob&=OBJC_FIND(t_a%(t_i&),0,t_inf&(t_i&,6),mx&,my&)
- IF next_ob&=-1
- OUT 2,7 !"Ping"
- next_ob&=0
- ELSE
- cont&=FORM_BUTTON(t_a%(t_i&),next_ob&,br&,next_ob&)
- ENDIF
- ENDIF
- '
- IF (NOT cont& OR NOT next_ob&) AND next_ob&<>edit_ob&
- ~OBJC_EDIT(t_a%(t_i&),edit_ob&,0,idx&,3,idx&)
- ENDIF
- '
- WEND
- '
- EXIT IF next_ob&<>t_inf&(t_i&,4) AND NOT BTST(next_ob&,31) !Exit-Flag
- '
- IF next_ob&=0 !ROOT is mover
- ~OBJC_EDIT(t_a%(t_i&),edit_ob&,0,idx&,3,idx&) !GEM-Cursor aus
- ENDIF
- '
- move_dial !Dialog verschieben
- '
- LOOP
- '
- back&=next_ob&
- '
- RETURN
- > PROCEDURE draw_dial(t_i&) !zeichnet Dialog
- '
- ' t_i& => Index des Dialogs
- '
- LOCAL i&,bx&,by&,x&,y&
- '
- BOUNDARY 1
- DEFLINE 1,0,0,0
- DEFFILL 1,0,0
- COLOR 1
- DEFTEXT 1
- '
- IF para%(6) !relativ zum Mauszeiger
- '
- ~GRAF_MKSTATE(x&,y&,i&,i&)
- '
- bx&=x&-(OB_W(t_a%(t_i&),0)-6) DIV 2
- by&=y&-(OB_H(t_a%(t_i&),0)-6) DIV 2
- '
- OB_X(t_a%(t_i&),0)=MAX(3,MIN(para%(0)-OB_W(t_a%(t_i&),0)-3,bx&))
- OB_Y(t_a%(t_i&),0)=MAX(para%(3)+6,MIN(para%(1)-OB_H(t_a%(t_i&),0)-3,by&))
- t_inf&(t_i&,0)=OB_X(t_a%(t_i&),0)-3
- t_inf&(t_i&,1)=OB_Y(t_a%(t_i&),0)-3
- '
- ENDIF
- '
- ~WIND_UPDATE(1)
- ~WIND_UPDATE(3)
- '
- ~FORM_DIAL(1,t_inf&(t_i&,0),t_inf&(t_i&,1),1,1,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
- scr2mem(0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
- '
- ~OBJC_DRAW(t_a%(t_i&),0,7,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
- '
- ' Linien zeichnen:
- '
- FOR i&=0 TO t_inf&(t_i&,8)
- PTSIN(0)=t_inf&(t_i&,0)+xy&(t_i&,i&,0)
- PTSIN(1)=t_inf&(t_i&,1)+xy&(t_i&,i&,1)
- PTSIN(2)=t_inf&(t_i&,0)+xy&(t_i&,i&,2)
- PTSIN(3)=t_inf&(t_i&,1)+xy&(t_i&,i&,3)
- VDISYS 6,0,2,0
- NEXT i&
- '
- RETURN
- > PROCEDURE undraw_dial(t_i&) !löscht Dialog
- '
- ' t_i& => Index des Dialogs
- '
- ~OBJC_CHANGE(t_a%(t_i&),b&,0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3),0,0)
- '
- mem2scr(0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
- ~FORM_DIAL(2,t_inf&(t_i&,0),t_inf&(t_i&,1),1,1,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
- ~WIND_UPDATE(2)
- ~WIND_UPDATE(0)
- '
- RETURN
- > PROCEDURE instal_g_user(adr%) !erzeugt G_USERDEF-Struktur
- '
- ' adr% => Adresse der Assemblerroutine
- '
- userblk%(user_c&)=adr%
- userblk%(user_c&+1)=OB_SPEC(t_a%(t_c&),ob_c&)
- OB_SPEC(t_a%(t_c&),ob_c&)=V:userblk%(user_c&)
- OB_TYPE(t_a%(t_c&),ob_c&)=24 !G_USERDEF
- ADD user_c&,2
- RETURN
- > PROCEDURE scr2mem(fl|,x&,y&,b&,h&) !Speicher retten
- '
- ' fl| => Hintergrund/Dialog/Popup (Flag)
- ' x&,y&,b&,h& => Koordinaten des zurettenden Bereichs
- '
- ~GRAF_MOUSE(256,0) !HIDE CURSOR
- '
- PTSIN(0)=x&
- PTSIN(1)=y&
- PTSIN(2)=x&+b&-1
- PTSIN(3)=y&+h&-1
- PTSIN(4)=0
- PTSIN(5)=0
- PTSIN(6)=b&-1
- PTSIN(7)=h&-1
- '
- INTIN(0)=3
- '
- SELECT fl|
- CASE 0
- z_ras0&(2)=b&
- z_ras0&(3)=h&
- z_ras0&(4)=((b&+15) DIV 16)
- z_ras0&(5)=0
- '
- LPOKE CONTRL+14,V:q_ras0&(0)
- LPOKE CONTRL+18,V:z_ras0&(0)
- CASE 1
- z_ras1&(2)=b&
- z_ras1&(3)=h&
- z_ras1&(4)=((b&+15) DIV 16)
- z_ras1&(5)=0
- '
- LPOKE CONTRL+14,V:q_ras1&(0)
- LPOKE CONTRL+18,V:z_ras1&(0)
- CASE 2
- z_ras2&(2)=b&
- z_ras2&(3)=h&
- z_ras2&(4)=((b&+15) DIV 16)
- z_ras2&(5)=0
- '
- LPOKE CONTRL+14,V:q_ras2&(0)
- LPOKE CONTRL+18,V:z_ras2&(0)
- ENDSELECT
- '
- VDISYS 109,1,4 !COPY RASTER OPAQUE
- '
- ~GRAF_MOUSE(257,0) !SHOW CURSOR
- '
- RETURN
- > PROCEDURE mem2scr(fl|,x&,y&,b&,h&) !Speicher restaurieren
- '
- ' fl| => Hintergrund/Dialog/Popup (Flag)
- ' x&,y&,b&,h& => Koordinaten des zurestaurierenden Bereichs
- '
- ~GRAF_MOUSE(256,0) !HIDE CURSOR
- '
- PTSIN(0)=0
- PTSIN(1)=0
- PTSIN(2)=b&-1
- PTSIN(3)=h&-1
- PTSIN(4)=x&
- PTSIN(5)=y&
- PTSIN(6)=x&+b&-1
- PTSIN(7)=y&+h&-1
- '
- INTIN(0)=3
- '
- SELECT fl|
- CASE 0
- LPOKE CONTRL+14,V:z_ras0&(0)
- LPOKE CONTRL+18,V:q_ras0&(0)
- CASE 1
- LPOKE CONTRL+14,V:z_ras1&(0)
- LPOKE CONTRL+18,V:q_ras1&(0)
- CASE 2
- LPOKE CONTRL+14,V:z_ras2&(0)
- LPOKE CONTRL+18,V:q_ras2&(0)
- ENDSELECT
- '
- VDISYS 109,1,4 !COPY RASTER OPAQUE
- '
- ~GRAF_MOUSE(257,0) !SHOW CURSOR
- '
- RETURN
- '
- ' *****************************************************************************
-